This page last changed on Dec 14, 2004 by plightbo.


下列标签与值栈交互, 并控制页面逻辑.

标签名 描述
通用标签
<ww:param /> 为支持参数的标签设置参数
<ww:property /> 从值栈中提取值并显示
<ww:push /> 将指定对象压入值栈顶端
<ww:set /> 创建你自己的命名变量
URL tag (<ww:url />) 构建一个已编码的URL
组件化标签
<ww:action /> 提供另一种调用活动的方法
<ww:bean /> 初始化一个Bean以便访问它的功能
<ww:include /> 用于包含另一个页面或活动
流程控制标签
<ww:if /> 根据条件决定语句是否执行
<ww:elseif /> 当前一个测试失败后用于决定语句是否执行.
<ww:else /> 如果前一个测试为false时执行
迭代标签
<ww:iterator /> 在一个集合上进行迭代
<ww:generator /> 常见迭代器
<ww:append /> 添加一个迭代器列表
<ww:subset /> 迭代一个可迭代对象的一部分
<ww:merge /> 将几个迭代器合并为一个
<ww:sort /> 对一个迭代器排序

通用标签

<ww:param />

允许为支持增加参数的标签设置参数.
属性名必需描述
value用于向标签传递数据.
name调用的活动名称.

你可以将param标签放置在支持参数标签的内部, param标签把参数加入到它的父标签. 如果value没有给定, 它将使用正文内容(body)作为value值.

在下面的例子中, 每一个param标签都把参数加到Counter上. 这意味着param将调用Counter对应的setter方法.

<ww:bean name="'webwork.util.Counter'" id="year">
  <ww:param name="'first'" value="text('firstBirthYear')"/>
  <ww:param name="'last'" value="2000"/>

  <ui:combobox label="'Birth year'" size="6" maxlength="4" name="'birthYear'" list="#year"/>
</ww:bean>


返回

<ww:property />

property标签从值栈中提取值并显示.
属性名必需描述
id为一个元素指定唯一的名字(注意).
value用于向标签传递数据.
escape决定正文是否需要进行适当的转码以符合HTML字符要求[如"&"转换为"&amp;"]

下面的例子描述它的不同用法:
Print getX().getY() 
<ww:property value="x.y"/>

缺生情况下将对HTML字符进行转码, 然而如果property标签的内容包含在正文(body)中时, 将不进行转码. 显示使用escape属性将覆盖缺省行为. 引用的文字在转码时, 其外面的引号(quote)将被去掉.

还要注意如果property标签的正文为空时(has an empty body), 它的行为与没有正文时一样.


返回

<ww:push />

利用ww:push, 你可以将对象压入值栈的顶部.
属性名 必需描述
value用于向标签传递数据.

与ww:set(见下文)标签的功能类似, 因此在决定使用前应当都看一下.

<ww:push value="counter">
  <ww:property value="count"/>
</ww:push>

要将一个活动放入值栈中可以使用下面的代码:

<ww:action name="'SomeAction'" id="sa"/>
<ww:push value="#sa">
 foo = <ww:property value="foo"/>
</ww:push>


返回

<ww:set />

使用ww:set标签, 你可以在JSP中创建一个自己命名变量. 可以使用#variableName的形式引用该变量.
属性名 必需描述
name 变量的唯一名称, 可以使用"#name"访问它.
value用于向标签传递数据.
scope变量的作用范围: 可以是page, request, session, application

将值栈中对象的值设置到指定的scope中. 如果值未给定, 将使用栈顶值. 如果scope未指定, 缺省的scope是活动上下文, 如果该请求并未执行任何活动, 将使用PageContext.


返回

组合化标签

<ww:action />

Action标签提供另一种调用活动的方法. 这是除了调用一个URL之外的另一个办法; 即 - *.action会被发送到ServletDispatcher.

属性名 必需描述
id为元素指定唯一名称(注意).
name被调用活动的名字.
namespace 活动的名空间
executeResult 是否执行结果

如果指定了id属性, 被执行的活动就可以使用"#id"在活动上下文中引用.

本例中, 活动ClientInfo将被执行, 它的方法将被用于获取信息并执行条件检查.
<ww:action name="'ClientInfo'" id="cinfo">
  <ww:param name="detailedMode" value="false"/>
</ww:action>
Browser:<ww:property value="#cinfo.browser"/><br>
Version:<ww:property value="#cinfo.version"/><br>
Supports GIF:<ww:if test="#cinfo.supportsType('image/gif') == true">Yes</ww:if>
<ww:else>No</ww:else><br>
 

返回

<ww:bean />

创建一个JavaBean并初始化它的属性, 并将它放入ActionContext.
属性名 必需描述
id为元素指定唯一名称(注意).
name被调用的活动[可能是笔误]名.

本例中, Counter被用作bean. 我们可以调用需要的方法. 本例中,我们调用setFirst()将出生年设置为1975并调用setLast()将它设置为2000. 然后将Counter作为一个迭代器显示一个组合框(combo box).
<ww:bean name="'webwork.util.Counter'" id="year">
  <ww:param name="'first'" value="text('firstBirthYear')"/>
  <ww:param name="'last'" value="2000"/>

  <ui:combobox label="'Birth year'" size="6" maxlength="4" name="'birthYear'" list="#year"/>
</ww:bean>

返回

<ww:include />

用于包含另一个页面或活动.
属性名 必需描述
page 页面或活动的名称.
value用于向标签传递数据.

本例中, beaninfo.jsp引入了一个Person对象people[0]. 看一下beaninfo.jsp的例子并注意它是如何利用".."从值栈中取出父页面的值.

<ww:property value="people[0]">
  <ww:include value="'beaninfo.jsp'"/>
</ww:property>

本例中调用了一个活动.
<h1>RSS viewer</h1>
<ww:include value="'rss.viewer.action'"/>

流程控制标签

返回

<ww:if />

根据条件决定语句是否执行.
属性 必需描述
id为元素指定唯一名称(注意).
test由WebWork解析器进行计算赋值的条件表达式. 它返回布尔值true或false.

本例中, 如果测试条件为true将执行标签内容(body). elseIf标签和else标签将不被执行.
<ww:if test="true == true">
   <b>if: Success</b>
</ww:if>

<ww:elseIf test="true == true">
   <b>elseIf: Failure</b>
</ww:elseIf>

<ww:else>
   <b>else: Failure</b>
</ww:else>

return to top

<ww:elseif />

当前一个测试失败后用于决定语句是否执行.
属性 必需描述
id为元素指定唯一名称(注意).
test由WebWork解析器进行计算赋值的条件表达式. 它返回布尔值true或false.

本例中, 由于elseIf标签的条件为true而if标签的条件为false, 因此将执行其内容(body).

<ww:if test="true == false">
   <b>if: Failures</b>
</ww:if>

<ww:elseIf test="true == true">
   <b>elseIf: Success</b>
</ww:elseIf>

<ww:else>
   <b>else: Failure</b>
</ww:else>

return to top

<ww:else />

如果前一个测试为false时执行.
属性 必需描述
id为元素指定唯一名称(注意).

本例中, 由于if标签和elseIf标签的条件均为false, else标签将执行其内容(body).
<ww:if test="true == false">
   <b>if: Failures</b>
</ww:if>

<ww:elseIf test="true == false">
   <b>elseIf: Failure</b>
</ww:elseIf>

<ww:else>
   <b>else: Success</b>
</ww:else>

迭代标签

返回

<ww:iterator />

Iterator标签将在一个集合之上进行迭代. 可迭代的值可以是下列之一: java.util.Collection, java.util.Iterator, java.util.Enumeration, java.util.Map, 数组, XML节点 或XML的NodeList.

属性名 必需描述
id为元素指定唯一名称(注意).
status该属性表示IteratorStatus对象将被暴露(exposed)出来并以此命名. 使用IteratorStatus对象可以获取迭代信息: getCount(), getIndex(), isFirst(), isLast(), isEven(), isOdd().
value用于向标签传递数据.

本例中, iterator标签将在Counter上进行迭代. property标签将输出从1到10的迭代值.
<ww:bean name="'webwork.util.Counter'">
  <ww:param name="'last'" value="10"/>

  <ww:iterator>
    <ww:property/><br />
  </ww:iterator>
</ww:bean>

本例中, 我们使用一对IteratorStatus以查看迭代中的位置.

<h1>Testing iterator status</h1>

<ww:bean name="'webwork.util.Counter'" id="rowcounter">
  <ww:param name="'first'" value="0"/>
  <ww:param name="'last'" value="5"/>
</ww:bean>

<table border="1">
  <ww:iterator value="#rowcounter" status="rowstatus">
  <tr>
    <ww:bean name="'webwork.util.Counter'" id="colcounter">
    	<ww:param name="'first'" value="0"/>
    	<ww:param name="'last'" value="5"/>
    </ww:bean>
    
    <ww:iterator value="#colcounter" status="colstatus">
     <!--
        if it is (first row) or (first column) or (last row) then
        output the column number.
      -->
      <ww:if test="#rowstatus.first==true || #colstatus.first==true || #rowstatus.last==true">
        <th><ww:property value="#colstatus.count"/></th>
      </ww:if>
      
      <ww:else>
        <td><ww:property/></td>
      </ww:else>
      
    </ww:iterator>

  </tr>
  </ww:iterator>
</table>

这里我们利用IteratorStatus完成隔行加入一个额外的换行. 这在绘制隔行不同的底色的HTML表格时十分有用. 奇数和偶数属性据可使用.

<ww:iterator status="status">
   <ww:if test="#status.odd == true"> <br /> </ww:if>
   <br />
</ww:iterator> 

Here we use the IteratorStatus determine every fourth row to insert an extra line break. 
<ww:iterator status="status">
  <ww:if test="#status.modulus(4) == 0"> <br /> </ww:if>
  <br />
</ww:iterator>

下面列出IteratorStatus对象可用的操作:

  • even : boolean - 如果当前迭代位置是偶数返回true
  • odd : boolean - 如果当前迭代位置是奇数返回true
  • count : int - 返回当前迭代位置的计数(从1开始)
  • index : int - 返回当前迭代位置的编号(从0开始)
  • first : boolean - 如果当前迭代位置是第一位时返回true
  • last : boolean - 如果当前迭代位置是最后一位时返回true
  • modulus(operand : int) : int - 返回当前计数(从1开始)与指定操作数的模数

返回

<ww:generator />

使用给定值生成迭代器(Iterator).

属性 必需描述
id为元素指定唯一名称(注意).
count迭代中的元素数量.
separatorStringTokenizer用于断字的字符.
val用于生成迭代列表的字符串.

本例中创建了两个迭代器. 一个是val="'foo,bar,xyzzy'" 另一个是val="' '".

<h1>Testing append, subset, and value generators</h1>

<table border="1">
  <ww:bean name="'webwork.util.Counter'">
    <ww:param name="'last'" value="5"/>
    <ww:iterator id="colcount">
      <tr>

        <!--
           Generator will create an Iterator that has 5 items.
           The first 3 are "foo,bar,xyzzy". Item 4 and 5 will be
           foo and bar respectively. If the count is more than
           the items, you start over.
        -->
        
        <ww:generator val="'foo,bar,xyzzy'" separator="','" count="#colcount" id="values"/>

       <!--
           Generator will create an Iterator that has infinite
            . Count=-1 means indefinite.
        -->
        <ww:generator val="' '" count="-1" id="space"/>
        <ww:append>
          <ww:param name="'source'" value="#values"/>
          <ww:param name="'source'" value="#space"/>

          <ww:subset count="6">
            <ww:iterator>
              <td width="40"><ww:property/></td>
            </ww:iterator>
          </iterator:subset>
        </iterator:append>
      </tr>
    </ww:iterator>
  </ww:bean>
</table>

该标签目前是多余的, 可以使用OGNL来完成:

<ww:iterator value="{1, 2, 3, 4}">
</ww:iterator>

返回

<ww:append />

Append标签用于添加一个迭代器列表. 迭代的值将被添加在一起并作为一个迭代器使用. 该迭代器的输出顺序与添加顺序一致.

属性 必需描述
id为元素指定唯一名称(注意).

本例中, 添加了两个迭代器#values和#spaces. 这意味着#spaces的值在#values之后.

<h1>Testing append, subset, and value generators</h1>

<table border="1">
  <ww:bean name="'webwork.util.Counter'">
    <ww:param name="'last'" value="5"/>
    <ww:iterator id="colcount">
      <tr>
        <ww:generator val="'foo,bar,xyzzy'" separator="','" count="#colcount" id="values"/>
        <ww:generator val="' '" count="-1" id="space"/>
        <ww:append>
          <ww:param name="'source'" value="#values"/>
          <ww:param name="'source'" value="#space"/>

          <ww:subset count="6">
            <ww:iterator>
              <td width="40"><ww:property/></td>
            </ww:iterator>
          </iterator:subset>
        </iterator:append>
      </tr>
    </ww:iterator>
  </ww:bean>
</table>

返回

<ww:subset />

Subset标签仅迭代source的一部分. 它从起点开始并进行count指定的迭代次数. 如果你想迭代到最后, 可以将count设置为-1. 如果不提供source属性, 将使用值栈的当前对象- ".".
属性 必需描述
id为元素指定唯一名称(注意).
count指定迭代次数.
source指定本标签操作的迭代器. 可以是Enumeration, Iterator, 或Collection.
start指定开始迭代的位置.

本例中, subset标签将对值栈中当前对象的6个元素进行迭代.

<h1>Testing append, subset, and value generators</h1>

<table border="1">
  <ww:bean name="'webwork.util.Counter'">
    <ww:param name="'last'" value="5"/>
    <ww:iterator id="colcount">
    <tr>
      <ww:generator val="'foo,bar,xyzzy'" separator="','" count="#colcount" id="values"/>
      <ww:generator val="' '" count="-1" id="space"/>
      <ww:append>
        <ww:param name="'source'" value="#values"/>
        <ww:param name="'source'" value="#space"/>

        <ww:subset count="6">
          <ww:iterator>
            <td width="40"><ww:property/></td>
          </ww:iterator>
        </iterator:subset>
      </iterator:append>
      </tr>
    </ww:iterator>
  </ww:bean>
</table>

返回

<ww:merge />

将几个迭代器合并为一个. 该标签将这些迭代器交织在一起. If one iterator runs out, it will drop off and the others will continue weaving until there are no more values.
属性 必需描述
id为元素指定唯一名称(注意).

本例中, #foo, #bar, and #xyzzy被合并在一起. 因此, 输出顺序是foo, bar, xyzzy until #foo #xyzzy iterators run out in which case #bar will finish.

Three value generators with merge and subset limits:<br>
<ww:generator val="'foo'" count="5" id="foo"/>
<ww:generator val="'bar'" count="10" id="bar"/>
<ww:generator val="'xyzzy'" count="5" id="xyzzy"/>
<ww:merge>
  <ww:param name="'source'" value="#foo"/>
  <ww:param name="'source'" value="#bar"/>
  <ww:param name="'source'" value="#xyzzy"/>

  <ww:subset count="30">
    <ww:iterator status="status">
      <ww:property value="#status.count"/>:<ww:property/><br>
    </ww:iterator>
  </iterator:subset>
</iterator:merge>

返回

<ww:sort />

Sort可以对一个迭代器进行排序. 它使用你提供的比较器(Comparator)进行比较, 使用Collections.sort()方法进行排序.
属性 必需描述
id为元素指定唯一名称(注意).
comparator用于集合排序的Compartor.
source指定本标签操作的迭代器.可以是Enumeration, Iterator, 或Collection.

本例进行升序排序.

<ww:bean name="'webwork.util.Counter'" id="counter">
  <ww:param name="'first'" value="0"/>
  <ww:param name="'last'" value="5"/>
</ww:bean>

<ww:bean name="'webwork.util.Sorter'" id="sorter"/>

Ascending:<br />
<ww:sort source="#counter" comparator="#sorter.ascending">
  <ww:iterator>
    <ww:property/><br />
  </ww:iterator>
</iterator:sort>

本例进行降序排序.

<ww:bean name="'webwork.util.Sorter'" id="sorter"/>

<ww:bean name="'webwork.util.Counter'" id="counter">
  <ww:param name="'first'" value="0"/>
  <ww:param name="'last'" value="5"/>
</ww:bean>

Descending:<br>
<ww:sort source="#counter" comparator="#sorter.descending">
  <ww:iterator>
    <ww:property/><br>
  </ww:iterator>
</iterator:sort>

本例进行字符串升序排序.

<ww:bean name="'webwork.util.Sorter'" id="sorter"/>

Sorting strings:<br>
<ww:generator val="'Rickard,Maurice,Hristo'" separator="','" id="names"/>
<ww:sort source="#names" comparator="#sorter.ascending">
  <ww:iterator>
    <ww:property/><br>
  </ww:iterator>
</iterator:sort>

注意


 Id 属性"id"为元素指定名字. 该名称在整个文档中必须是唯一的. 该属性是由TagSupport提供的, 因此永远是一个字符串. 不需要像其他WebWork标签那样使用字符串文法(string literal); 也就是说 - id="'age'". 你可以直接使用id="age".


必需注意的是所有将某些值保存在值栈的标签(如i18n或bean)都将在标签结束时从值栈中将它们删除.
因此, 如果你用bean标签实例化一个bean(<ww:bean name="'br.univap.fcc.sgpw.util.FormattersHelper'">), 该bean仅在</ww:bean>标签之前才能在值栈中访问.
Document generated by Confluence on Dec 14, 2004 16:36